namespace SmartMathLibrary
{
    /// <summary>
    /// Interface to implement a ComplexRationalPolynomial class.
    /// </summary>
    public interface IComplexRationalPolynomial
    {
        /// <summary>
        /// Gets or sets the numerator value of the rational polynomial.
        /// </summary>
        /// <value>The numerator value of the rational polynomial.</value>
        ComplexPolynomial NumeratorPolynomial { get; set; }

        /// <summary>
        /// Gets or sets the denumerator value of the rational polynomial.
        /// </summary>
        /// <value>The denumerator value of the rational polynomial.</value>
        ComplexPolynomial DenominatorPolynomial { get; set; }

        /// <summary>
        /// Copies the current instance of a polynomial.
        /// </summary>
        /// <returns>The copied instance of the current polynomial.</returns>
        ComplexRationalPolynomial Copy();

        /// <summary>
        /// Compares the current instance of a polynomial to another one.
        /// </summary>
        /// <param name="compare">The polynomial to compare.</param>
        /// <returns>True if the polynomials are even otherwise, false.</returns>
        bool CompareTo(ComplexRationalPolynomial compare);

        /// <summary>
        /// Solves the polynomial at the specified position x.
        /// </summary>
        /// <param name="x">The specified position x.</param>
        /// <returns>
        /// The result f(x) at the specified position x.
        /// </returns>
        ComplexNumber SolveAt(double x);

        /// <summary>
        /// Solves the polynomial at the specified position x.
        /// </summary>
        /// <param name="x">The specified position x.</param>
        /// <returns>
        /// The result f(x) at the specified position x.
        /// </returns>
        ComplexNumber SolveAt(ComplexNumber x);

        /// <summary>
        /// Creates the first derivative of the polynomial.
        /// </summary>
        /// <returns>Returns the derivative of the polynomial.</returns>
        ComplexRationalPolynomial Derivative();

        /// <summary>
        /// Multiplies the polynomial with a scalar.
        /// </summary>
        /// <param name="scalar">The scalar value.</param>
        void MultiplyWithScalar(int scalar);

        /// <summary>
        /// Multiplies the polynomial with a scalar.
        /// </summary>
        /// <param name="scalar">The scalar value.</param>
        void MultiplyWithScalar(double scalar);

        /// <summary>
        /// Divides the polynomial through scalar.
        /// </summary>
        /// <param name="scalar">The scalar value.</param>
        void DivideWithScalar(int scalar);

        /// <summary>
        /// Divides the polynomial through scalar.
        /// </summary>
        /// <param name="scalar">The scalar value.</param>
        void DivideWithScalar(double scalar);

        /// <summary>
        /// Inverts the fraction of the rational polynomial.
        /// </summary>
        void InvertFraction();
    }
}